import { get, post, postWithQueryParams } from "@/api/request";

/**
 * 用户控制器 / 用户控制器添加
 * @param {object} data
 * @param {string} [data.address] 通讯地址
 * @param {string} [data.cardNum] 证件号码
 * @param {string} [data.cardType] 证件类型 可选值: ID_CARD, PASS_PORT
 * @param {number} [data.departId] 部门id
 * @param {string} [data.duties] 职务
 * @param {string} [data.gender] 性别
 * @param {string} [data.nation] 名族
 * @param {string} [data.notes] 备注
 * @param {string} [data.password] 密码
 * @param {string} [data.pic] 照片
 * @param {string} [data.realName] 用户姓名
 * @param {string} [data.status] 启用状态 可选值: DISABLED, ENABLED
 * @param {string} [data.telephone] 手机号
 * @param {string} [data.username] 用户账号
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<User页面展示实体>}
 * @author 方昊
 */
export function systemUserAdd(data, config) {
  return post("/system/user/add", data, config);
}

/**
 * 用户控制器 / 用户控制器用户添加角色
 * @param {object} data
 * @param {number} [data.parentTenantId] 上级租户ID，如果是顶级租户，则传自己的ID
 * @param {array<string>} [data.roleCode] 角色编码列表
 * @param {array<string>} [data.username] 用户名列表
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<UaaUsers页面展示实体>}
 * @author 方昊
 */
export function systemUserAssignRole(data, config) {
  return post("/system/user/assignRole", data, config);
}

/**
 * 用户控制器 / 用户控制器批量解除冻结账号
 * @param {object} data
 * @param {array<string>} [data.list] 用户名列表
 * @param {string} [data.parentTenantId] 上级租户ID，如果是顶级租户，则传自己的ID
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise}
 * @author 陈凯
 */
export function systemUserBatchRelieve(data, config) {
  return post("/system/user/batchRelieve", data, config);
}

/**
 * 用户控制器 / 用户控制器通过用户名批量删除
 * @param {object} data
 * @param {array<string>} [data.list] 用户名列表
 * @param {string} [data.parentTenantId] 上级租户ID，如果是顶级租户，则传自己的ID
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<number>}
 * @author 方昊
 */
export function systemUserDelete(data, config) {
  return post("/system/user/delete", data, config);
}

/**
 * 用户控制器 / 用户控制器查询详情
 * @param {object} params
 * @param {number} params.id 用户ID
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<UaaUsers页面展示实体>}
 * @author 方昊
 */
export function systemUserDetail(params, config) {
  return get("/system/user/detail", params, config);
}

/**
 * 用户控制器 / 用户控制器分页查询
 * @param {object} data
 * @param {number} [data.departId] 部门编号
 * @param {string} [data.gender] 性别
 * @param {number} [data.id] 用户ID
 * @param {number} [data.length] 分页大小
 * @param {number} [data.orderAsc] 排序方向
 * @param {string} [data.orderColum] 排序字段
 * @param {number} [data.pageIndex] 分页下标
 * @param {string} [data.realName] 用户姓名
 * @param {number} [data.roleId] 角色id
 * @param {number} [data.start] 查询记录起始下标
 * @param {string} [data.status] 账号状态 可选值: DISABLED, ENABLED
 * @param {string} [data.telephone] 手机号
 * @param {number} [data.tenantId] 租户ID
 * @param {string} [data.username] 用户账号
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<分页返回实体<UaaUsers页面展示实体>>}
 * @author 方昊
 */
export function systemUserList(data, config) {
  return post("/system/user/list", data, config);
}

/**
 * 用户控制器 / 用户控制器用户列表
 * @param {object} params
 * @param {object} data
 * @param {number} [params.departId] departId
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<array<UaaUsers页面展示实体>>}
 * @author 肖玮
 */
export function systemUserListNoPage(params, data, config) {
  return postWithQueryParams("/system/user/listNoPage", params, data, config);
}

/**
 * 用户控制器 / 用户控制器查询部门用户列表
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<array<UserDepartment页面展示实体>>}
 * @author 肖玮
 */
export function systemUserListUserDepartment(config) {
  return get("/system/user/listUserDepartment", config);
}

/**
 * 用户控制器 / 用户控制器查询用户的菜单列表
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<array<Permission页面展示实体>>}
 * @author 方昊
 */
export function systemUserMenu(config) {
  return get("/system/user/menu", config);
}

/**
 * 用户控制器 / 用户控制器查询当前用户信息
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<UaaUsers页面展示实体>}
 * @author 方昊
 */
export function systemUserMy(config) {
  return get("/system/user/my", config);
}

/**
 * 用户控制器 / 用户控制器通过用户名批量密码重置
 * @param {object} data
 * @param {array<string>} [data.list] 用户名列表
 * @param {string} [data.parentTenantId] 上级租户ID，如果是顶级租户，则传自己的ID
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<number>}
 * @author 方昊
 */
export function systemUserPasswordReset(data, config) {
  return post("/system/user/passwordReset", data, config);
}

/**
 * 用户控制器 / 用户控制器删除用户角色
 * @param {object} data
 * @param {array<string>} [data.roleCode] 角色编码列表
 * @param {array<string>} [data.username] 用户名
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<number>}
 * @author 方昊
 */
export function systemUserRemoveRole(data, config) {
  return post("/system/user/removeRole", data, config);
}

/**
 * 用户控制器 / 用户控制器更新
 * @param {object} data
 * @param {string} [data.address] 通讯地址
 * @param {string} [data.birthday] 生日 YYYY-MM-DD HH:mm:ss
 * @param {string} [data.cardNum] 证件号码
 * @param {string} [data.cardType] 证件类型 可选值: ID_CARD, PASS_PORT
 * @param {number} [data.departId] 部门ID
 * @param {string} [data.duties] 职务
 * @param {string} [data.email] 邮箱
 * @param {string} [data.gender] 性别
 * @param {number} [data.id] 用户ID
 * @param {string} [data.jobNumber] 工号
 * @param {string} [data.landlineNumber] 座机号码
 * @param {string} [data.nation] 名族
 * @param {string} [data.password] 密码
 * @param {string} [data.pic] 照片
 * @param {string} [data.realName] 用户姓名
 * @param {string} [data.status] 启用状态 可选值: DISABLED, ENABLED
 * @param {string} [data.telephone] 手机号
 * @param {string} [data.username] 用户账号
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<UaaUsers页面展示实体>}
 * @author 方昊
 */
export function systemUserUpdate(data, config) {
  return post("/system/user/update", data, config);
}

/**
 * 用户控制器 / 用户控制器通过用户名批量冻结账号
 * @param {object} data
 * @param {array<string>} [data.list] 用户名列表
 * @param {string} [data.parentTenantId] 上级租户ID，如果是顶级租户，则传自己的ID
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise}
 * @author 方昊
 */
export function systemUserUpdateBatch(data, config) {
  return post("/system/user/updateBatch", data, config);
}

/**
 * 用户控制器 / 用户控制器修改用户密码
 * @param {object} data
 * @param {string} [data.confirmPassword] 重复密码
 * @param {string} [data.newPassword] 新密码
 * @param {string} [data.oldPassword] 原始密码
 * @param {import("axios").AxiosRequestConfig} [config]
 * @returns {Promise<User页面展示实体>}
 * @author 方昊
 */
export function systemUserUpdatePassword(data, config) {
  return post("/system/user/updatePassword", data, config);
}

/**
 * @template T
 * @typedef {Object} 分页返回实体
 * @property {T[]} content - 内容
 * @property {number} elementsNo
 * @property {number} limit
 * @property {number} number
 * @property {number} totalElements
 * @property {number} totalPages
 * @description 分页返回实体
 */

/**
 * @typedef {object} Permission页面展示实体 页面展示实体
 * @property {number} applicationId 应用ID
 * @property {object} attachment 附件页面展示实体
 * @property {string} attachment.attKey 附件key
 * @property {number} attachment.attOrder 附件排序
 * @property {number} attachment.attSize 附件大小(单位:MB)
 * @property {string} attachment.attSizeString 附件大小
 * @property {string} attachment.attSuffix 附件后缀
 * @property {string} attachment.attUrl 附件url
 * @property {string} attachment.attachmentType 文件类型
 * @property {string} attachment.createTime 创建时间
 * @property {string} attachment.createUser 创建用户
 * @property {boolean} attachment.delFlag 删除标识(false:否, true:是)
 * @property {number} attachment.directoryId 目录id
 * @property {number} attachment.id 主键
 * @property {string} attachment.originalName 原始文件名
 * @property {string} attachment.remark 备注
 * @property {string} attachment.updateTime 修改时间
 * @property {string} attachment.updateUser 修改用户
 * @property {string} btnIdentifying 按钮标识
 * @property {string} code 权限编码
 * @property {string} createTime 创建时间
 * @property {string} createUser 创建用户
 * @property {boolean} delFlag 删除标识(false:否, true:是)
 * @property {string} highlightUrl 高亮地址
 * @property {string} icon 菜单图标
 * @property {string} id 主键
 * @property {number} image 图片ID
 * @property {string} imageUrl 图片地址
 * @property {boolean} isBreadcrumbShow 是否显示在面包屑中（false不显示；true显示）
 * @property {boolean} isIndexShow 是否在首页显示
 * @property {boolean} isNavbarShow 是否显示在左侧导航栏中（false不显示；true显示）
 * @property {string} name 权限名称
 * @property {number} orderValue 排序值
 * @property {string} parameters 路由参数
 * @property {string} parentId 上级编码
 * @property {string} redirectUrl 重定向地址
 * @property {string} status 菜单状态 可选值: DISABLE, ENABLE
 * @property {string} type 权限类型 可选值: BUTTON, MENU
 * @property {string} updateTime 更新时间
 * @property {string} updateUser 更新用户
 * @property {string} url 路由地址
 * @description 页面展示实体
 */

/**
 * @typedef {object} UaaUsers页面展示实体 页面展示实体
 * @property {string} birthday 生日
 * @property {string} createUser 创建用户
 * @property {string} created 创建时间
 * @property {boolean} delFlag 删除标识(false:否, true:是)
 * @property {string} department 部门信息
 * @property {string} duties 职务
 * @property {string} email 信箱
 * @property {string} gender 性别
 * @property {string} id 用户ID
 * @property {boolean} is_internal 0非内置用户；1内置用户
 * @property {string} jobNumber 工号
 * @property {string} landlineNumber 座机号码
 * @property {string} lastLoginTime 最后一次登录时间
 * @property {string} lastPasswordUpdateTime 最后一次密码修改时间
 * @property {string} parentTenantId 所属父租户ID
 * @property {boolean} passwordExpired 密码是否过期（1已过期，0未过期）
 * @property {string} realName 用户姓名
 * @property {string} role
 * @property {string} status 启用状态 可选值: DISABLED, ENABLED
 * @property {string} telephone 手机号
 * @property {string} tenantId 所属租户ID
 * @property {string} updateTime 更新时间
 * @property {string} updateUser 更新用户
 * @property {string} userType 用户类型 可选值: SYSTEM, TENANT
 * @property {string} username 用户账号
 * @description 页面展示实体
 */

/**
 * @typedef {object} User页面展示实体 页面展示实体
 * @property {string} address 通讯地址
 * @property {string} birthday 生日
 * @property {string} cardNum 证件号码
 * @property {string} cardType 证件类型 可选值: ID_CARD, PASS_PORT
 * @property {string} createUser 创建用户
 * @property {string} created 创建时间
 * @property {boolean} delFlag 删除标识(false:否, true:是)
 * @property {string} departId 部门ID
 * @property {string} duties 职务
 * @property {string} email 信箱
 * @property {number} enabled 启用状态（1已启用，0已禁用）
 * @property {string} gender 性别
 * @property {string} id 用户ID
 * @property {boolean} is_internal 0非内置用户；1内置用户
 * @property {string} jobNumber 工号
 * @property {string} landlineNumber 座机号码
 * @property {string} lastLoginTime 最后一次登录时间
 * @property {string} lastPasswordUpdateTime 最后一次密码修改时间
 * @property {string} notes 备注
 * @property {string} parentTenantId 所属父租户ID
 * @property {boolean} passwordExpired 密码是否过期（1已过期，0未过期）
 * @property {string} pic 照片
 * @property {string} realName 用户姓名
 * @property {string} telephone 手机号
 * @property {string} tenantId 所属租户ID
 * @property {string} updateTime 更新时间
 * @property {string} updateUser 更新用户
 * @property {string} userType 用户类型(tenant、system)
 * @property {string} username 用户账号
 * @description 页面展示实体
 */

/**
 * @typedef {object} UserDepartment页面展示实体 部门用户页面展示实体
 * @property {string} id id
 * @property {boolean} isDepartment 是否是部门
 * @property {string} name 部门/人员名称
 * @property {string} parentId 上级部门id
 * @description 部门用户页面展示实体
 */
